<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 4.0.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">
  <link rel="alternate" href="/atom.xml" title="dy2903的博客" type="application/atom+xml">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">


<script id="hexo-configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '7.5.0',
    exturl: false,
    sidebar: {"position":"left","display":"post","offset":12,"onmobile":false},
    copycode: {"enable":false,"show_result":false,"style":null},
    back2top: {"enable":true,"sidebar":false,"scrollpercent":false},
    bookmark: {"enable":false,"color":"#222","save":"auto"},
    fancybox: false,
    mediumzoom: false,
    lazyload: false,
    pangu: false,
    algolia: {
      appID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    },
    localsearch: {"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},
    path: '',
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    translation: {
      copy_button: 'Copy',
      copy_success: 'Copied',
      copy_failure: 'Copy failed'
    },
    sidebarPadding: 40
  };
</script>

  <meta name="description" content="本文为《大话存储》的读书笔记。 计算机的IO世界总线总线的概念 计算机中所有的IO都通过共享总线的方式来实现。  总线实际上就是一条或多条的物理导线。密密麻麻的印到电路板上，而且为了避免高频振荡的干扰，一般都会分组印刷到不同的电路板上，然后压合起来。 总线的分类  PCI总线是目前x86服务器普遍使用的南桥与外设连接的总线技术。  PCI总线的地址总线和数据总线是分时复用的，这样可以节省管脚数量。">
<meta name="keywords" content="存储 笔记">
<meta property="og:type" content="article">
<meta property="og:title" content="大话存储，学习笔记（1,2,3章），磁盘.md">
<meta property="og:url" content="https:&#x2F;&#x2F;duyang2903.gitee.io&#x2F;2017&#x2F;11&#x2F;14&#x2F;%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%881,2,3%E7%AB%A0%EF%BC%89%EF%BC%8C%E7%A3%81%E7%9B%98&#x2F;index.html">
<meta property="og:site_name" content="dy2903的博客">
<meta property="og:description" content="本文为《大话存储》的读书笔记。 计算机的IO世界总线总线的概念 计算机中所有的IO都通过共享总线的方式来实现。  总线实际上就是一条或多条的物理导线。密密麻麻的印到电路板上，而且为了避免高频振荡的干扰，一般都会分组印刷到不同的电路板上，然后压合起来。 总线的分类  PCI总线是目前x86服务器普遍使用的南桥与外设连接的总线技术。  PCI总线的地址总线和数据总线是分时复用的，这样可以节省管脚数量。">
<meta property="og:locale" content="en">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-ea0b4a369a2b24e1.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-f740f94cc0533c91.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-376d2c76486d6ff2.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-f3cc8cefb6058c71.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2592dd049a78594f.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2ecaa66752ba6eaa.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-5aa0c0d273157104.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-46923668dadc9ed0.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-0876fb7ee646aa80.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2e37a9bb6aff2879.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2f7edafdb3180f95.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:updated_time" content="2019-11-15T03:11:45.700Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-ea0b4a369a2b24e1.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">

<link rel="canonical" href="https://duyang2903.gitee.io/2017/11/14/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%881,2,3%E7%AB%A0%EF%BC%89%EF%BC%8C%E7%A3%81%E7%9B%98/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome: false,
    isPost: true,
    isPage: false,
    isArchive: false
  };
</script>

  <title>大话存储，学习笔记（1,2,3章），磁盘.md | dy2903的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-meta">

    <div>
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">dy2903的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
        <p class="site-subtitle">与肝胆人共事，从无字句读书</p>
  </div>

  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>
</div>


<nav class="site-nav">
  
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>Home</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>Archives</a>

  </li>
  </ul>

</nav>
</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content">
            

  <div class="posts-expand">
      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block " lang="en">
    <link itemprop="mainEntityOfPage" href="https://duyang2903.gitee.io/2017/11/14/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%881,2,3%E7%AB%A0%EF%BC%89%EF%BC%8C%E7%A3%81%E7%9B%98/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="dy2903">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="dy2903的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          大话存储，学习笔记（1,2,3章），磁盘.md
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2017-11-14 00:00:00" itemprop="dateCreated datePublished" datetime="2017-11-14T00:00:00+08:00">2017-11-14</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2019-11-15 11:11:45" itemprop="dateModified" datetime="2019-11-15T11:11:45+08:00">2019-11-15</time>
              </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <p>本文为《大话存储》的读书笔记。</p>
<h1 id="计算机的IO世界"><a href="#计算机的IO世界" class="headerlink" title="计算机的IO世界"></a>计算机的IO世界</h1><h2 id="总线"><a href="#总线" class="headerlink" title="总线"></a>总线</h2><h3 id="总线的概念"><a href="#总线的概念" class="headerlink" title="总线的概念"></a>总线的概念</h3><blockquote>
<p>计算机中所有的IO都通过共享总线的方式来实现。</p>
</blockquote>
<p>总线实际上就是一条或多条的物理导线。密密麻麻的印到电路板上，而且为了避免高频振荡的干扰，一般都会分组印刷到不同的电路板上，然后压合起来。</p>
<h3 id="总线的分类"><a href="#总线的分类" class="headerlink" title="总线的分类"></a>总线的分类</h3><p><img src="http://upload-images.jianshu.io/upload_images/1323506-ea0b4a369a2b24e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<blockquote>
<p><strong>PCI总线</strong>是目前x86服务器普遍使用的<strong>南桥与外设</strong>连接的总线技术。</p>
</blockquote>
<p>PCI总线的<strong>地址总线和数据总线</strong>是分时复用的，这样可以节省管脚数量。</p>
<p>在数据传输时，PCI协议上有三种不同的角色</p>
<ul>
<li>主，也就是发起者</li>
<li>从，Target或者Slave</li>
<li>仲裁者Arbiter</li>
</ul>
<h2 id="CPU、内存、磁盘交互过程"><a href="#CPU、内存、磁盘交互过程" class="headerlink" title="CPU、内存、磁盘交互过程"></a>CPU、内存、磁盘交互过程</h2><p>下面我们来介绍一下<strong>CPU、内存、磁盘交互过程</strong></p>
<p>CPU、内存、磁盘通过总线相互连接，所以通路的因素具备了。</p>
<p>然后需要上通路上的设备有不同的标识，这样才可以区分开。<strong>所以每个IO设备在启动的时候，都需要向物理机的内存中映射一个地址。</strong></p>
<p>接下来是<strong>发</strong>的过程。</p>
<p>CPU首先将IO地址放到系统总线上，接下来传三条指令</p>
<ul>
<li>是想读还是想写，是否开磁盘缓存等。</li>
<li>从哪儿读：磁盘的LBA地址</li>
<li>读到地址放到内存那里？<br>通过总线传到磁盘控制器上。</li>
</ul>
<p>接着<code>磁盘控制器</code>主要做：</p>
<ul>
<li>查找并寻道</li>
<li>通过<code>DMA</code>技术，也就是磁盘控制器可以直接对<strong>内存</strong>寻址并进行写操作。（这样可以解放CPU）</li>
</ul>
<blockquote>
<p>上述所说的过程均为CPU对磁盘发送某种指令的信息，<strong>告诉磁盘控制器应该怎么操作</strong>。而这一类的指令可以分为SCSI指令集和ATA指令集。SCSI指令集更高效。</p>
</blockquote>
<p>所以所谓<code>SCSI指令集</code>其实就是CPU告诉磁盘控制器到底是想读还是想写，从磁盘的那个位置开始，有多长等关键信息的规范</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-f740f94cc0533c91.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h1 id="磁盘原理"><a href="#磁盘原理" class="headerlink" title="磁盘原理"></a>磁盘原理</h1><p>本章所提到的磁盘主要指的是机械磁盘。</p>
<p>要了解磁盘主要需要通过如下几个方面；</p>
<ul>
<li>磁盘的结构</li>
<li>数据的组织方式</li>
<li>高层技术：队列、无序存储、磁盘缓存</li>
<li>磁盘接口技术</li>
<li>磁盘驱动程序</li>
</ul>
<h2 id="为什么需要磁盘"><a href="#为什么需要磁盘" class="headerlink" title="为什么需要磁盘"></a>为什么需要磁盘</h2><p>CPU的速度比内存块100倍，比硬盘快100万倍，也就是说磁盘速度是相当的慢的，有人说整个系统的速度就是被磁盘拖慢的。确实如此，但是为什么还需要磁盘呢？</p>
<p>内存的速度虽然快，但是<strong>断电</strong>了怎么办，而且硬盘是以TB甚至TB计算的，内存如果达到这么大的容量，价格将不可想象。</p>
<p>我们可以憧憬一下，人类如果造出一个能断电存储、容量还得大、访问速度快最关键的要<strong>便宜</strong>的硬盘来，CPU就可以直接访问硬盘了。但是在这之间，我们还是必须容忍<strong>CPU-内存-硬盘</strong>速度不匹配的问题，这才引出了诸多的解决方案，比如用<strong>缓存、DMA、多线程等</strong></p>
<h2 id="磁盘的结构"><a href="#磁盘的结构" class="headerlink" title="磁盘的结构"></a>磁盘的结构</h2><p><img src="http://upload-images.jianshu.io/upload_images/1323506-376d2c76486d6ff2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>磁盘主要由盘片、磁头、步进电机构成</p>
<ul>
<li>硬盘一般是多个盘片固定在一个公共的<strong>转轴</strong>上</li>
<li>主轴电机带动盘片组高速旋转产生<strong>高速气流</strong>，将磁头浮起；</li>
<li>磁头组在电机的带动下作<strong>径向运动</strong></li>
</ul>
<p>通俗的说来，盘片上布满磁性介质，类似于一张<strong>白纸</strong>，如果想在上面记录的话，一般需要划<strong>格子</strong>，格子就是所谓的磁道。</p>
<p><strong>因为盘片是圆的，所以就每个同心圆（磁道）就是类似于稿纸的一行，每一行上再分为若干的格子（扇区）</strong>，磁头就类似于打印喷头</p>
<p>对于打印机来说，需要纸不断的移动，但是这样效率太低了，对于磁盘来说可以让磁盘不断的旋转，然后移动磁头来进行换行。</p>
<blockquote>
<p>目前服务器中一般选择1万转/s，可以获得比较高的性价比。</p>
</blockquote>
<ul>
<li>磁道：同心圆</li>
<li>扇区：每个同心圆的上每段<strong>圆弧</strong>，是读写的<strong>最小单位</strong></li>
<li>柱面：<strong>所有盘面上的同一磁道</strong>，在竖直方向上构成一个<strong>圆柱。</strong></li>
<li>每个盘片上都有可以读写数据的<strong>磁头</strong>。</li>
</ul>
<blockquote>
<p><strong>需要注意</strong>的是，数据的读写是按照<strong>柱面</strong>来进行的，也就是说首先在同一柱面的内从0磁头开始，依次向下在同一柱面的不同盘面上进行操作。为什么会这样呢？因为这样操作只需要改变<strong>电流</strong>，只需要通过电子切换，而不需要改变磁道（机械切换），速度更快。</p>
</blockquote>
<p>我们需要记住一个<code>规律</code>：把磁头挪到指定的<strong>磁道</strong>的速度是非常慢的。</p>
<h2 id="扇区寻址"><a href="#扇区寻址" class="headerlink" title="扇区寻址"></a>扇区寻址</h2><p>了解了磁盘结构以后，我们来看一下磁盘如何寻址。</p>
<p>我们可以把寻找磁盘里面的数据想象成在一个<strong>小区</strong>里面找某一户人家一样。我们需要知道三个信息：在哪一栋、哪一层、哪一户，然后就可以找到他了。同样，找磁盘上的数据可以通过<strong>柱面（哪一栋）、磁头（哪一层）、扇区（哪一户）</strong>找到某个数据。</p>
<p>但是这种编码方式比较的麻烦，不利于程序的编写。就比如一户人家在12栋3楼4号，并不直观。那么我们可以用一个<strong>线性地址</strong><code>120304</code>来表示这户人家的地址，显然这种方法更利于编程。</p>
<p>所以我们可以将<strong>磁道磁头扇区与另一种线性地址对应</strong>起来，这种对应关系保存在磁盘控制电路的ROM里面，可以在磁盘初始化的时候载入缓存以便查询。</p>
<blockquote>
<p>于是磁盘可以对外提供<strong>线性地址</strong>，即LBA（Logical block address）地址。可以将磁盘想象成只有一个磁道，是无限长的直线，扇区为上面的等长的线段，这样可以屏蔽柱面、磁头等比较复杂的东西，对外而言寻址方式更为简便。</p>
</blockquote>
<blockquote>
<p>也就是说通过磁盘控制器可以对外屏蔽查找具体扇区的细节，进行逻辑的抽象，这样就完成了物理地址到逻辑地址的抽象、虚拟、映射</p>
</blockquote>
<h2 id="磁盘高层技术"><a href="#磁盘高层技术" class="headerlink" title="磁盘高层技术"></a>磁盘高层技术</h2><p>我们在前面的介绍中说过，磁盘进行磁道的切换最费时间，所以我们会通过多种方法来避免频繁的磁道切换。如下就是比较常用的解决方案。</p>
<h3 id="队列技术"><a href="#队列技术" class="headerlink" title="队列技术"></a>队列技术</h3><p>第一个指令向让读最外圈的数据，第二个指令向读最内圈的数据，第三个指令又向读最外圈的数据，如果按照这个顺序来，需要频繁的换道，我们知道换道时间非常长，是性能的瓶颈。</p>
<p>所以可以先切换到最外圈，执行完第一个指令，然后先执行第三个指令，最后再执行第二个指令，类似于电梯，<strong>每次把同方向的人都搭载上去。</strong></p>
<h3 id="无序传输技术"><a href="#无序传输技术" class="headerlink" title="无序传输技术"></a>无序传输技术</h3><p>要求读某些扇区的内容，如果不做优化的话，肯定直接傻乎乎的从开头开始读。但是实际上，有可能磁头离数据段的末尾近啊。</p>
<p>那么我们完全可以无视读出数据的顺序，从<strong>离磁头近</strong>的扇区开始读。</p>
<h3 id="磁盘缓存"><a href="#磁盘缓存" class="headerlink" title="磁盘缓存"></a>磁盘缓存</h3><p>磁盘的速度是相当慢的，所以与外界的内存、CPU的访问有极大的矛盾。就好比一个团队里面，有人做事快，有人做事慢，做事快的就会等做事慢的。</p>
<p>当然这种矛盾是无法调和的，那有什么折中的方法吗？有，有句话叫<code>笨鸟先飞</code>，所谓缓存就是笨鸟先飞。</p>
<p>比如说做事慢的人，虽然手脚不麻利，但是有个好处，记忆力好，而且勤奋。所以当事来了以后，他虽然没办法立刻给答复，但他可以先记住啊，然后告诉做事快的人先去忙。同样，他也可以提前把一些事先做了，然后准备着。避免手忙脚乱。</p>
<p>回到磁盘上，<code>缓存</code>其实就是一块电路板上的RAM芯片，他的速度就很快，而且如果断电的话，里面的数据会丢失。</p>
<p><strong>缓存</strong>的主要的作用是：</p>
<ul>
<li>接收指令和数据</li>
<li>进行预读</li>
</ul>
<p>有些资料说禁用磁盘缓存，这种说法容易造成误解。</p>
<p>实际上禁用磁盘缓存就是Write Through（直通）模式，也就是说磁盘收到指令和数据并需要进行写入的时候，不是在数据到达缓存的时候就返回成功，而是<strong>应该等到数据都落入盘片以后</strong>，才向<code>控制器</code>返回成功信号。<strong>相当于禁用了缓存</strong></p>
<p>实际上这种模式，数据还是会到达缓存。<br>SCSI指令中有两个参数可以控制缓存：</p>
<ul>
<li>DPO(Disable PageOut)：禁止缓存中的数据页被换出，置了这个位的数据不能将其他数据换出。</li>
<li>FUA：Force Unit Access：强制盘片访问，也就是Write Through</li>
</ul>
<p>所以如果DPO和FUA都置1了， 相当于完全不使用缓存的提速作用。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-f3cc8cefb6058c71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h3 id="影响磁盘性能的因素"><a href="#影响磁盘性能的因素" class="headerlink" title="影响磁盘性能的因素"></a>影响磁盘性能的因素</h3><ul>
<li>转速：主要影响连续IO的吞吐量。因为转得越快，数据传输时间越短。</li>
<li>寻道速度：主要影响<strong>随机IO</strong>。因为随机IO下，必须频繁的换道。</li>
<li>单碟容量：单碟容量越高，单位空间内的数据量越大</li>
<li>接口速度：最不重要，因为目前的接口速度已经满足了磁盘能达道的最高传输带宽。</li>
</ul>
<h2 id="磁盘接口技术"><a href="#磁盘接口技术" class="headerlink" title="磁盘接口技术"></a>磁盘接口技术</h2><p>不管硬盘内部多么复杂，一定需要向使用者提供接口，以屏蔽访问的细节，这个接口不是物理的接口，而是硬盘面向外部的时候，为了被方便的使用，<strong>所提供的抽象的协议。</strong></p>
<p>目前硬盘提供的物理接口</p>
<ul>
<li>用于ATA指令的IDE接口</li>
<li>用于ATA指令的SATA接口</li>
<li>用于SCSI指令的并行SCSI接口</li>
<li>用于SCSI指令的串行SCSI（SAS）接口</li>
<li>用于SCSI指令系统，并且承载于FC协议的串行FC接口</li>
</ul>
<p>列成表格如下</p>
<table>
<thead>
<tr>
<th>接口</th>
<th>英文</th>
<th>指令系统</th>
<th>备注</th>
</tr>
</thead>
<tbody><tr>
<td>IDE接口</td>
<td>Parallel ATA(Advanced Technology Attachment)</td>
<td>ATA指令系统</td>
<td>Integrated Drive Electronics</td>
</tr>
<tr>
<td>SATA接口</td>
<td>Serial ATA</td>
<td>ATA指令系统</td>
<td></td>
</tr>
<tr>
<td>并行SCSI接口</td>
<td>Parallel SCSI(small computer system interface)</td>
<td>SCSI指令系统</td>
<td></td>
</tr>
<tr>
<td>SAS接口</td>
<td>serial SCSI</td>
<td>SCSI指令系统</td>
<td></td>
</tr>
<tr>
<td>FC接口</td>
<td>Fibre Channel</td>
<td>SCSI指令系统</td>
<td>承载FC协议的串行SCSI接口</td>
</tr>
</tbody></table>
<h3 id="IDE硬盘接口"><a href="#IDE硬盘接口" class="headerlink" title="IDE硬盘接口"></a>IDE硬盘接口</h3><p>IDE，integrated Drive Electronics ，电子集成驱动器，本意是把控制电路、盘片、磁头放到一个容器中的硬盘驱动器，制造比较容易。</p>
<p>IDE接口，也称PATA接口，也即并行ATA</p>
<blockquote>
<p>ATA协议需要主机更多参与IO，无法支持大量的并发访问，适用于家用电脑和低端服务器；</p>
</blockquote>
<h3 id="SATA硬盘接口"><a href="#SATA硬盘接口" class="headerlink" title="SATA硬盘接口"></a>SATA硬盘接口</h3><blockquote>
<p>SATA：串性ATA，用串行线路传输数据，但是指令集仍然是ATA。</p>
</blockquote>
<p>下图是IDE与SATA线缆的对比</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-2592dd049a78594f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>SATA的优点是：</p>
<ul>
<li>可以对指令及数据包进行CRC，而PATA只能对来回传输的数据进行较验。</li>
<li>相对于IDE的80芯更<strong>节省空间。</strong></li>
</ul>
<p>目前SATA规范中接口速率为6Gb/s，有于SATA使用8bit/10bit编码，所以6Gb/s相当于600MB/s的接口速率，但是实际上性能没有得到多大的提升。</p>
<p>因为硬盘的速率瓶颈在于硬盘内部的寻道，而非传输，<strong>接口速率的提高最直接影响从缓存中的读写。</strong></p>
<h3 id="SCSI硬盘接口"><a href="#SCSI硬盘接口" class="headerlink" title="SCSI硬盘接口"></a>SCSI硬盘接口</h3><p>SCSI接口更为<strong>灵活</strong>，而且<strong>性能</strong>也较高。</p>
<p>可以有8个或者16个SCSI设备连接在SCSI通道上，缺点是比较贵。因为一般需要配备价格不菲的<strong>SCSI卡</strong>，而且SCSI接口的设备在安装、设置时比较麻烦。</p>
<p>SCSI总线连接图：<br><img src="http://upload-images.jianshu.io/upload_images/1323506-2ecaa66752ba6eaa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>一条总线上最多16个节点，各分配一个SCSI ID <strong>，其中SCSI控制器需要占一个ID</strong></p>
<p><strong>SCSI卡上有一块类似CPU的芯片可以对SCSI设备进行控制，减少了CPU的负担，所以适合大量并发访问场景，适用于企业级数据中心</strong></p>
<p>SCSI卡将SCSI总线上的设备，经过PCI总线传递给内存中运行的SCSI卡的<code>驱动程序</code>，<strong>让OS知道所有设备。</strong></p>
<p>下图是SCSI总线与计算机总线的连接图</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-5aa0c0d273157104.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>可以看出SCSI卡一端接主机的PCI，一端用SCSI控制器接入SCSI总线。</p>
<blockquote>
<p>多通道SCSI卡：如果一张卡上有多个控制器，每个控制器独立掌管一条总线</p>
</blockquote>
<p>多通道SCSI控制器卡示意图<br><img src="http://upload-images.jianshu.io/upload_images/1323506-46923668dadc9ed0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h4 id="SCSI协议寻址方式"><a href="#SCSI协议寻址方式" class="headerlink" title="SCSI协议寻址方式"></a>SCSI协议寻址方式</h4><p>SCSI协议的寻址方式按照<strong>“控制器——通道——SCSI ID —— LUN ID (logic unit number) ”。</strong></p>
<p>一个主机IO总线上可以有多个控制器，每个控制器可以有多条后端的SCSI总线（通道），每个SCSI总线上挂着8个或者16个SCSI设备，通过SCSI ID来区分。</p>
<p>然而SCSI ID不是最后一层地址，还有一个LUN ID 。 SCSI设备不能物理上再分割了，所以只能在逻辑上分，每个SCSI ID下面可以区分出若干的LUN ID 。这样一条SCSI总线上可接入的逻辑存储单元数量大大增加。</p>
<p>LUN对于传统的SCSI总线意义不大，但是对带RAID功能的SCSI接口磁盘阵列来说，因为会产生很多虚拟磁盘，所以可以使用LUN来扩充可寻址范围。习惯上称磁盘阵列生成的虚拟磁盘为LUN。</p>
<blockquote>
<p>SCSI控制器也是总线上的一个节点，不过优先级必须是最高的。</p>
</blockquote>
<h2 id="磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别"><a href="#磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别" class="headerlink" title="磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别"></a>磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别</h2><h3 id="磁盘控制器"><a href="#磁盘控制器" class="headerlink" title="磁盘控制器"></a>磁盘控制器</h3><p>硬盘的接口：</p>
<ul>
<li>物理接口：硬盘接入磁盘控制器需要的接口</li>
<li>逻辑接口：指令系统，指令集定义了“怎么样向磁盘发送数据和读数据”，这套指令集是由专门的芯片来生成，这就是<code>磁盘控制器</code></li>
</ul>
<blockquote>
<p>磁盘控制器的作用：参与底层总线的初始化、仲裁过程，向驱动程序提供简单的接口。</p>
</blockquote>
<p>所以<code>驱动程序</code>只需要将要读写的<strong>设备号、读写的初始地址、长度</strong>告诉控制器即可，其他的由控制器来完成</p>
<h3 id="驱动器控制器电路"><a href="#驱动器控制器电路" class="headerlink" title="驱动器控制器电路"></a>驱动器控制器电路</h3><ul>
<li>驱动器控制电路：位于磁盘的<strong>驱动器</strong>上，负责驱动磁头臂来读写数据</li>
<li>磁盘控制器：向磁盘驱动器的控制器电路发送指令。</li>
</ul>
<p>所以流程是，CPU通过总线发送指令给主板上的磁盘控制器，<br>磁盘控制器通过线缆发送指令给驱动器<br>驱动器控制磁盘进行读写。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-0876fb7ee646aa80.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<blockquote>
<p>CPU操作磁盘控制器的指令系统叫磁盘控制器<code>驱动程序</code><br>控制器收到指令通过电路逻辑运算生成的指令就是常说的<code>ATA指令集或者SCSI指令集。</code></p>
</blockquote>
<h3 id="为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？"><a href="#为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？" class="headerlink" title="为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？"></a>为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？</h3><p>机器刚通电，OS还没启动起来，<strong>所以也没加载磁盘控制器驱动，如何访问磁盘的呢？</strong></p>
<p>这要从机器启动的流程说起，系统的BIOS中存放了初始化系统的基本代码，所以机器启动后执行系统BIOS里面的代码，里面有一步就是去查找<strong>磁盘控制器上的BIOS地址</strong>，然后去这个地方再执行其中的代码以初始化控制器。</p>
<p>最后此BIOS让CPU提取0磁道中的第1扇区的代码，从而加载OS。</p>
<p>从上面的流程可以看出，系统BIOS会指示CPU查找<strong>磁盘控制器的BIOS地址</strong>，里面有最基本的磁盘控制器驱动程序。但是因为不完善，所以在OS内核启动的过程中，会用自己的驱动来接管。</p>
<p><strong>那么向SCSI磁盘上安装OS，必须手动加载SCSI驱动就原因就不难解释了。</strong></p>
<p>因为CPU必须通过执行驱动程序才能向磁盘驱动器发指令，而磁盘控制器BIOS里面的代码非常简单，功能很有限，只能适用于启动OS这种临时任务。所以必须加载完整功能的驱动程序。</p>
<p>对于ATA磁盘来说，ATA已经是非常成熟的技术了，控制器一般都是Intel的，所以操作系统安装程序在初始化执行的时候已经自行加载了驱动。</p>
<p>而SCSI磁盘的生产厂商很多，所以必须手动加载。</p>
<p>安装了OS的系统，启动之初从磁盘BIOS（ROM）中读取驱动程序，此时的执行速度很慢，但是一旦将OS本身的驱动程序读到了内存中以后，速度就可以增加。由于操作系统安装以后，就具有磁盘的驱动程序了，所以不需要每次手动加载。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-2e37a9bb6aff2879.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="磁盘IOPS和吞吐量"><a href="#磁盘IOPS和吞吐量" class="headerlink" title="磁盘IOPS和吞吐量"></a>磁盘IOPS和吞吐量</h2><p>衡量磁盘的性能最重要的两个参数就是IOPS和吞吐量。</p>
<p>IOPS关注的就是每秒进行多少次的IO，跟随机读写的快慢有关。<br>而吞吐量关注的是硬盘在传输数据的时候数据流的速度。</p>
<h3 id="IOPS"><a href="#IOPS" class="headerlink" title="IOPS"></a>IOPS</h3><blockquote>
<p>IOPS：也就是每秒能进行多少次IO。这个值也不是固定的。</p>
</blockquote>
<p>写入10000个大小为1KB的文件，比写入一个10MB的文件耗费更多的时间。</p>
<p>因为10000个文件需要做好几万次IO，而写入10MB的大文件，因为是连续存放，所以只需要几十个IO。<br>对于写入10000个小文件，因为每秒需要的IO非常高，如果用具有较高IOPS的磁盘，将提速不少。写入10MB文件，就算用了较高的IOPS也不会提升速度。因为只需要少量的IO。只有用较大传输带宽的才会体现优势。</p>
<h2 id="传输带宽"><a href="#传输带宽" class="headerlink" title="传输带宽"></a>传输带宽</h2><blockquote>
<p>传输带宽：硬盘在传输数据时的数据流的速度。</p>
</blockquote>
<p>在同一块硬盘写入不同大小的数据，带宽不同。</p>
<p>硬盘的带宽如果高，在传输大块的连续的数据时有优势。</p>
<p>而具有高IOPS的硬盘在传输小块的不连续的数据具有优势。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-2f7edafdb3180f95.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>

    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E5%AD%98%E5%82%A8-%E7%AC%94%E8%AE%B0/" rel="tag"># 存储 笔记</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-next post-nav-item">
            </div>

            <span class="post-nav-divider"></span>

            <div class="post-nav-prev post-nav-item">
                <a href="/2017/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%882%E7%AB%A0%EF%BC%89%EF%BC%8C-SSD/" rel="prev" title="大话存储，学习笔记（2章），SSD">
                  大话存储，学习笔记（2章），SSD <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
      </footer>
    
  </article>
  
  
  

  </div>


          </div>
          

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#计算机的IO世界"><span class="nav-number">1.</span> <span class="nav-text">计算机的IO世界</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#总线"><span class="nav-number">1.1.</span> <span class="nav-text">总线</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#总线的概念"><span class="nav-number">1.1.1.</span> <span class="nav-text">总线的概念</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#总线的分类"><span class="nav-number">1.1.2.</span> <span class="nav-text">总线的分类</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#CPU、内存、磁盘交互过程"><span class="nav-number">1.2.</span> <span class="nav-text">CPU、内存、磁盘交互过程</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#磁盘原理"><span class="nav-number">2.</span> <span class="nav-text">磁盘原理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#为什么需要磁盘"><span class="nav-number">2.1.</span> <span class="nav-text">为什么需要磁盘</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#磁盘的结构"><span class="nav-number">2.2.</span> <span class="nav-text">磁盘的结构</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#扇区寻址"><span class="nav-number">2.3.</span> <span class="nav-text">扇区寻址</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#磁盘高层技术"><span class="nav-number">2.4.</span> <span class="nav-text">磁盘高层技术</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#队列技术"><span class="nav-number">2.4.1.</span> <span class="nav-text">队列技术</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#无序传输技术"><span class="nav-number">2.4.2.</span> <span class="nav-text">无序传输技术</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#磁盘缓存"><span class="nav-number">2.4.3.</span> <span class="nav-text">磁盘缓存</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#影响磁盘性能的因素"><span class="nav-number">2.4.4.</span> <span class="nav-text">影响磁盘性能的因素</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#磁盘接口技术"><span class="nav-number">2.5.</span> <span class="nav-text">磁盘接口技术</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#IDE硬盘接口"><span class="nav-number">2.5.1.</span> <span class="nav-text">IDE硬盘接口</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#SATA硬盘接口"><span class="nav-number">2.5.2.</span> <span class="nav-text">SATA硬盘接口</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#SCSI硬盘接口"><span class="nav-number">2.5.3.</span> <span class="nav-text">SCSI硬盘接口</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#SCSI协议寻址方式"><span class="nav-number">2.5.3.1.</span> <span class="nav-text">SCSI协议寻址方式</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别"><span class="nav-number">2.6.</span> <span class="nav-text">磁盘控制器、驱动器控制器电路、磁盘控制器驱动程序的区别</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#磁盘控制器"><span class="nav-number">2.6.1.</span> <span class="nav-text">磁盘控制器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#驱动器控制器电路"><span class="nav-number">2.6.2.</span> <span class="nav-text">驱动器控制器电路</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？"><span class="nav-number">2.6.3.</span> <span class="nav-text">为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动？</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#磁盘IOPS和吞吐量"><span class="nav-number">2.7.</span> <span class="nav-text">磁盘IOPS和吞吐量</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#IOPS"><span class="nav-number">2.7.1.</span> <span class="nav-text">IOPS</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#传输带宽"><span class="nav-number">2.8.</span> <span class="nav-text">传输带宽</span></a></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">dy2903</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">20</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
      <div class="site-state-item site-state-tags">
        <span class="site-state-item-count">2</span>
        <span class="site-state-item-name">tags</span>
      </div>
  </nav>
</div>
  <div class="feed-link motion-element">
    <a href="/atom.xml" rel="alternate">
      <i class="fa fa-rss"></i>RSS
    </a>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">dy2903</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> v4.0.0
  </div>
  <span class="post-meta-divider">|</span>
  <div class="theme-info">Theme – <a href="https://pisces.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Pisces</a> v7.5.0
  </div>

        












        
      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script><script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>



  
















  

  

</body>
</html>
